/*多态的优劣 */
package polymorphismdemo3;

public class Test {
    public static void main(String[] args) {
        // 创建对象
        animal a = new dog();
        // 编译看左边，运行看右边
        a.eat();

        // 多态的弊端
        // 不能调用子类特有的方法
        // 如a.lookHome() 会报错
        // 原因：编译看左边，运行看右边。 所以编译的时候会检查左边的父类中有没有这个方法，没有便会报错

        // 解决方案：变回子类类型
        /*
         * dog d = (dog) a;
         * d.lookHome();
         */
        // tip:转化的时候不可瞎转，如这里不可以转化成猫 cat c=(cat)a;便会报错

        // 先判断a是否为dog类型，如果是强制转化为dog型，转化后变量名为d
        if (a instanceof dog d) {
            d.lookHome();
        } else if (a instanceof cat c) {
            c.catchMouse();
        } else {
            System.out.println("没有这个类型，无法转化");
        }
    }

}

class animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

class dog extends animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void lookHome() {
        System.out.println("狗看家");
    }
}

class cat extends animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

// 优势：使用父类型作为参数可以接收所有子类对象
// 劣势：不能使用子类特有方法
// 转化类型的方法：1.自动类型的转化 如Person p=new Student() 2.强制转化 如Stduent s=(Student)p;
// 强制转化能解决什么问题：
// 1.可以转化成真正的子类类型，从而调用子类的方法 2.转化类型与真实类型不一致会报错 3.转化时可用instanceof进行判断